Jackson-এ Invalid JSON Data এবং Missing Fields হ্যান্ডল করার জন্য কাস্টম কনফিগারেশন এবং Exception Management ব্যবহার করা যায়। JSON ডেসিরিয়ালাইজেশনের সময় ডেটা অনুপস্থিত বা ভুল হলে ত্রুটি নির্ধারণ এবং তা হ্যান্ডল করা একটি গুরুত্বপূর্ণ দিক।
Invalid JSON Data হ্যান্ডল করা
Common Errors:
- JSON সিনট্যাক্স ভুল।
- ডেটার টাইপ ভুল (যেমন,
Stringএর স্থানেInteger)। - অপ্রত্যাশিত বা অজানা ফিল্ড।
Default Behavior:
- Jackson ডিফল্টভাবে Invalid JSON-এর জন্য
JsonParseExceptionএবংJsonMappingExceptionথ্রো করে।
1. Invalid JSON Data হ্যান্ডল করার কনফিগারেশন
কোড উদাহরণ:
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) {
String invalidJson = """
{
"id": 101,
"name": "John Doe",
"age": "not_a_number"
}
""";
ObjectMapper objectMapper = new ObjectMapper();
try {
User user = objectMapper.readValue(invalidJson, User.class);
} catch (JsonParseException e) {
System.out.println("JSON Parsing Error: " + e.getMessage());
} catch (JsonMappingException e) {
System.out.println("JSON Mapping Error: " + e.getMessage());
} catch (Exception e) {
System.out.println("General Error: " + e.getMessage());
}
}
}
class User {
public int id;
public String name;
public int age; // Will cause a mapping error for "not_a_number"
}
আউটপুট:
JSON Mapping Error: Cannot deserialize value of type `int` from String "not_a_number": not a valid Integer value
2. Unknown Fields হ্যান্ডল করা
ডিফল্টভাবে, অজানা (unknown) ফিল্ড থাকলে UnrecognizedPropertyException থ্রো হয়। এটি নিষ্ক্রিয় করার জন্য DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES ব্যবহার করা হয়।
কোড উদাহরণ:
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) throws Exception {
String jsonWithExtraField = """
{
"id": 101,
"name": "John Doe",
"email": "john.doe@example.com" // Unknown field
}
""";
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
User user = objectMapper.readValue(jsonWithExtraField, User.class);
System.out.println("User Name: " + user.name);
}
}
class User {
public int id;
public String name;
}
আউটপুট:
User Name: John Doe
Missing Fields হ্যান্ডল করা
Default Behavior:
Jackson ডিফল্টভাবে Missing Fields এর জন্য কোনো ত্রুটি দেয় না। ডেসিরিয়ালাইজেশনের সময় অনুপস্থিত ফিল্ডগুলো null বা প্রাথমিক মান (default value) সেট করে।
1. Required Fields চিহ্নিত করা
Custom Validation with Annotations:
Java Bean Validation (Hibernate Validator) ব্যবহার করে Required Fields চিহ্নিত করা যায়।
import javax.validation.constraints.NotNull;
class User {
@NotNull(message = "ID cannot be null")
public Integer id;
@NotNull(message = "Name cannot be null")
public String name;
}
Spring Boot Integration:
@RestController
@RequestMapping("/api")
public class UserController {
@PostMapping("/user")
public ResponseEntity<String> createUser(@Valid @RequestBody User user) {
return ResponseEntity.ok("User created successfully");
}
}
Global Exception Handler:
@ControllerAdvice
public class ValidationExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<String> handleValidationExceptions(MethodArgumentNotValidException ex) {
String errors = ex.getBindingResult().getFieldErrors().stream()
.map(error -> error.getField() + ": " + error.getDefaultMessage())
.collect(Collectors.joining(", "));
return ResponseEntity.badRequest().body("Validation Errors: " + errors);
}
}
2. Default Values সেট করা
Jackson @JsonProperty এনোটেশন দিয়ে Default Value সেট করতে পারে।
import com.fasterxml.jackson.annotation.JsonProperty;
class User {
@JsonProperty(defaultValue = "0")
public int id;
@JsonProperty(defaultValue = "Unknown")
public String name;
public int age;
}
Custom Error Handling for Missing and Invalid Fields
Jackson মডিউলে @JsonSetter এবং @JsonIgnoreProperties ব্যবহার করে কাস্টম হ্যান্ডলিং করা যায়।
1. @JsonSetter এর ব্যবহার
import com.fasterxml.jackson.annotation.JsonSetter;
class User {
public int id;
private String name;
@JsonSetter
public void setName(String name) {
if (name == null || name.isEmpty()) {
this.name = "Default Name";
} else {
this.name = name;
}
}
public String getName() {
return name;
}
}
2. @JsonIgnoreProperties এর ব্যবহার
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
class User {
public int id;
public String name;
}
Exception Handling for Invalid JSON
Custom Exception Handler Class:
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(JsonMappingException.class)
public ResponseEntity<String> handleJsonMappingException(JsonMappingException ex) {
return new ResponseEntity<>("Invalid JSON Mapping: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(JsonParseException.class)
public ResponseEntity<String> handleJsonParseException(JsonParseException ex) {
return new ResponseEntity<>("Invalid JSON Syntax: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGeneralException(Exception ex) {
return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
Key Takeaways
- Invalid JSON Data:
- JsonParseException: JSON সিনট্যাক্স ভুল হলে।
- JsonMappingException: টাইপ বা কাঠামো না মিললে।
- Missing Fields:
- Default value সেট করার জন্য @JsonProperty(defaultValue) ব্যবহার।
- Validation দিয়ে প্রয়োজনীয় ফিল্ড নিশ্চিত।
- Custom Handling:
- DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES ব্যবহার করে অজানা ফিল্ড ইগনোর করা।
- Spring Boot-এ Global Exception Handling সহজ।
- Global ObjectMapper Config:
- Missing বা Invalid Fields হ্যান্ডল করার জন্য একটি Global ObjectMapper তৈরি করুন এবং সেটিকে কনফিগার করুন।
এই পদ্ধতিগুলো ব্যবহার করে আপনি Invalid JSON এবং Missing Fields সহজেই হ্যান্ডল করতে পারবেন।
Read more